#ifndef MATERIALVO_H
#define MATERIALVO_H

#include <QObject>
#include <QString>
#include <QDateTime>

/**
 * @brief 物料视图对象类
 *
 * 该类用于封装物料的视图展示数据，整合了物料基本信息与关联的仓库、货架信息，
 * 适用于前端界面展示，包含物料名称、型号、图片、库存及关联的仓库和货架名称等属性。
 */
class MaterialVO : public QObject
{
    Q_OBJECT
    // 声明元对象属性，便于通过元对象系统访问
    Q_PROPERTY(int inventory_id READ get_inventory_id WRITE set_inventory_id)
    Q_PROPERTY(int warehouse_id READ get_warehouse_id WRITE set_warehouse_id)
    Q_PROPERTY(int shelf_id READ get_shelf_id WRITE set_shelf_id)
    Q_PROPERTY(int material_id READ get_material_id WRITE set_material_id)
    Q_PROPERTY(QString material_name READ get_material_name WRITE set_material_name)
    Q_PROPERTY(QString model READ get_model WRITE set_model)
    Q_PROPERTY(QString image READ get_image WRITE set_image)
    Q_PROPERTY(QString warehouse_name READ get_warehouse_name WRITE set_warehouse_name)
    Q_PROPERTY(QString shelf_name READ get_shelf_name WRITE set_shelf_name)
    Q_PROPERTY(int inventory_quantity READ get_inventory_quantity WRITE set_inventory_quantity)
    Q_PROPERTY(int material_quantity READ get_material_quantity WRITE set_material_quantity)
    Q_PROPERTY(QDateTime create_time READ get_create_time WRITE set_create_time)
    Q_PROPERTY(QDateTime update_time READ get_update_time WRITE set_update_time)

private:
    int inventory_id;                     // 库存ID
    int warehouse_id;                     // 仓库ID
    int shelf_id;                         // 货架ID
    int material_id;                      // 物料ID
    QString material_name;                // 物料名称，用于标识物料的名称信息
    QString model;                        // 型号规格，描述物料的具体型号参数
    QString image;                        // 图片路径，存储物料图片的相对/绝对路径
    QString warehouse_name;               // 仓库名称，关联存储该物料的仓库名称
    QString shelf_name;                   // 货架名称，关联存储该物料的货架名称
    int inventory_quantity;               // 库存数量，记录该物料在指定位置的库存数量
    int material_quantity;                // 物料总数量
    QDateTime create_time;                // 创建时间，记录物料信息的创建时间戳
    QDateTime update_time;                // 更新时间，记录物料信息最后修改的时间戳

public:
    /**
     * @brief 无参构造函数
     *
     * 初始化所有数值类型属性为0，字符串为空，
     * 时间戳为默认值，适合需要后续通过setter方法设置属性的场景。
     */
    explicit MaterialVO(QObject *parent = nullptr)
        : QObject(parent),
          inventory_id(0),
          warehouse_id(0),
          shelf_id(0),
          material_id(0),
          inventory_quantity(0),
          material_quantity(0)
    {}

    /**
     * @brief 全参数构造函数
     *
     * 一次性初始化所有属性，适合整合多表查询结果后创建展示对象。
     */
    MaterialVO(int inventory_id,
              int warehouse_id,
              int shelf_id,
              int material_id,
              const QString& material_name,
              const QString& model,
              const QString& image,
              const QString& warehouse_name,
              const QString& shelf_name,
              int inventory_quantity,
              int material_quantity,
              const QDateTime& create_time,
              const QDateTime& update_time,
              QObject *parent = nullptr)
        : QObject(parent),
          inventory_id(inventory_id),
          warehouse_id(warehouse_id),
          shelf_id(shelf_id),
          material_id(material_id),
          material_name(material_name),
          model(model),
          image(image),
          warehouse_name(warehouse_name),
          shelf_name(shelf_name),
          inventory_quantity(inventory_quantity),
          material_quantity(material_quantity),
          create_time(create_time),
          update_time(update_time)
    {}

    // -------------------------- Getter 方法 --------------------------
    int get_inventory_id() const { return inventory_id; }
    int get_warehouse_id() const { return warehouse_id; }
    int get_shelf_id() const { return shelf_id; }
    int get_material_id() const { return material_id; }
    QString get_material_name() const { return material_name; }
    QString get_model() const { return model; }
    QString get_image() const { return image; }
    QString get_warehouse_name() const { return warehouse_name; }
    QString get_shelf_name() const { return shelf_name; }
    int get_inventory_quantity() const { return inventory_quantity; }
    int get_material_quantity() const { return material_quantity; }
    QDateTime get_create_time() const { return create_time; }
    QDateTime get_update_time() const { return update_time; }

    // -------------------------- Setter 方法 --------------------------
    void set_inventory_id(int value) { inventory_id = value; }
    void set_warehouse_id(int value) { warehouse_id = value; }
    void set_shelf_id(int value) { shelf_id = value; }
    void set_material_id(int value) { material_id = value; }
    void set_material_name(const QString& value) { material_name = value; }
    void set_model(const QString& value) { model = value; }
    void set_image(const QString& value) { image = value; }
    void set_warehouse_name(const QString& value) { warehouse_name = value; }
    void set_shelf_name(const QString& value) { shelf_name = value; }
    void set_inventory_quantity(int value) { inventory_quantity = value; }
    void set_material_quantity(int value) { material_quantity = value; }
    void set_create_time(const QDateTime& value) { create_time = value; }
    void set_update_time(const QDateTime& value) { update_time = value; }
};

#endif // MATERIALVO_H
